package util;

import DAO.MyDrawPane;
import DAO.NodeList;
import DAO.TreeNode;

/**
 * 设置节点位置的工具类
 */
public class NodeLocatorUtil {

    // 设置x轴方向的位置
    public static void locateX(TreeNode node) {

        //判断是否为根节点
        if(node.getPid() != 0) {  // 不为根节点
            TreeNode p = new TreeNode();
            p = NodeList.getParent(node);
            if(node.getPos()==1) {
                node.setX(p.getX() + p.getWidth() + 50);  // 在右边就+宽度+50，在左边就-宽度-50
            }else{
                node.setX(p.getX() - node.getWidth() - 50);
            }
        }else {   // 根节点放在画布中间
            node.setX(MyDrawPane.drawPane.getWidth()/2-node.getWidth()/2);
        }
        for(int i = 0;i < node.getNodeChildren().size();i++) {
            locateX(node.getNodeChildren().get(i));  // 循环递归
        }

    }

    // 设置y轴方向的位置
    public static void locateY(TreeNode node) {
        if(node.getPid() != 0) {
            TreeNode p = NodeList.getParent(node);  // 取到该节点的父接的节点
            //第一个子节点
            if(NodeList.isFirstChild(node)) {
                double pchildHeight = NodeList.getChildHeight(p,node.getPos());  // 取到父节点的高度
                double childHeight = NodeList.getChildHeight(node,node.getPos());  // 取到子节点的高度
                if(node.getNid() == p.getNodeChildren().get(p.getNodeChildren().size()-1).getNid()) {
                    node.setY(p.getY() + p.getHeight()/2 - node.getHeight()/2);
                }else {
                    node.setY(p.getY() + p.getHeight()/2 - (pchildHeight - childHeight + node.getHeight())/2);
                }

            }else{//剩下的子节点
                TreeNode preChild = NodeList.getPreChild(node);  // 获取当前节点的前一个兄弟节点
                double prechildHeight = NodeList.getChildHeight(preChild,node.getPos());  // 获取前一个兄弟节点的高度
                double childHeight = NodeList.getChildHeight(node,node.getPos()); // 获取当前节点的高度
                // 设置节点的y坐标，以保持水平间距和中心对齐，同时增加30单位的偏移
                node.setY(preChild.getY() + preChild.getHeight()/2 +(prechildHeight + childHeight - node.getHeight())/2 + 30);
            }
        }else { //设置根节点的位置位于画布中间
            node.setY(MyDrawPane.drawPane.getHeight()/2-node.getHeight()/2);
        }
        for(int i = 0;i < node.getNodeChildren().size();i++) {
            locateY(node.getNodeChildren().get(i));  // 循环递归
        }
    }
}


